/*
 * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
 *
 * https://www.mall4j.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */
package com.yami.shop.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
import com.yami.shop.bean.dto.AreaDto;
import com.yami.shop.bean.model.Area;
import com.yami.shop.dao.AreaMapper;
import com.yami.shop.service.AreaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Service;

import java.util.Iterator;
import java.util.List;

/**
 * @author lgh on 2018/10/26.
 */
@Service
public class AreaServiceImpl extends ServiceImpl<AreaMapper, Area> implements AreaService {

    @Autowired
    private AreaMapper areaMapper;

    @Override
    @Cacheable(cacheNames = "area", key = "#pid")
    public List<Area> listByPid(Long pid) {
        List<Area> areas = areaMapper.listByPid(pid);
        // 过滤没有子地区的二级地区
        if (areas.size() > 0 && areas.get(0).getLevel().equals(2)) {
            final Iterator<Area> iterator = areas.iterator();
            while (iterator.hasNext()) {
                Area area = iterator.next();
                List<Area> areaList = areaMapper.listByPid(area.getAreaId());
                if (areaList.size() == 0) {
                    iterator.remove();
                }
            }
        }
        return areas;
//        return areaMapper.selectList(new LambdaQueryWrapper<Area>().eq(Area::getParentId, pid));
    }

    @Override
    @CacheEvict(cacheNames = "area", key = "#pid")
    public void removeAreaCacheByParentId(Long pid) {

    }

    @Override
    @Caching(evict = {
            @CacheEvict(cacheNames = "area", key = "'areaList'"),
            @CacheEvict(cacheNames = "area", key = "'areaProvinceList'")
    })
    public void removeAreaListCache() {
    }

    @Override
    @Cacheable(cacheNames = "area", key = "'areaList'")
    public List<AreaDto> getAreaListInfo() {
        List<AreaDto> areaList = areaMapper.getAreaListInfo();
        for (AreaDto province : areaList) {
            List<Long> cityAll = Lists.newArrayList();
            for (AreaDto city : province.getAreas()) {
                cityAll.add(city.getAreaId());
                List<Long> areaAll = Lists.newArrayList();
                for (AreaDto area : city.getAreas()) {
                    areaAll.add(area.getAreaId());
                }
                city.setAreaIds(areaAll);
            }
            province.setAreaIds(cityAll);
        }
        return areaList;
    }

    @Override
    @Cacheable(cacheNames = "area", key = "'areaProvinceList'")
    public List<Area> getProvinceInfoList() {
        List<Area> areaList = areaMapper.selectList(new LambdaQueryWrapper<Area>().eq(Area::getParentId, 0));
        return areaList;
    }

    @Override
    public List<AreaDto> listAreaOfEnable() {
        return areaMapper.listAreaOfEnable();
    }
}
